
import java.util.Stack;


public class LeetCode_20 {

    /*给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

            有效字符串需满足：

            左括号必须用相同类型的右括号闭合。
            左括号必须以正确的顺序闭合。
            每个右括号都有一个对应的相同类型的左括号*/

  /*  public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '{' || c == '[') {
                // 如果是左括号，则压入栈中
                stack.push(c);
            } else if (c == ')' || c == '}' || c == ']') {
                // 如果是右括号，则需要检查栈是否为空以及栈顶的左括号是否与当前的右括号匹配
                if (stack.isEmpty()) {
                    // 栈为空，说明没有对应的左括号，字符串无效
                    return false;
                }
                char topChar = stack.pop(); // 弹出栈顶的左括号
                if ((c == ')' && topChar != '(') || (c == '}' && topChar != '{') || (c == ']' && topChar != '[')) {
                    // 如果不匹配，字符串无效
                    return false;
                }
            }
        }
        // 遍历完所有字符后，检查栈是否为空
        return stack.isEmpty();
    }*/
    /*public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i =0; i < s.length(); i++){
            char c = s.charAt(i);
            if(c=='(' || c=='{' || c=='{'){
                stack.push(c);
            }else if(c==')' || c=='}' || c==']'){
                if(stack.empty()){
                    return false;
                }
            }
           char topChar = stack.pop();
            if((c==')'&&topChar=='(') || (c=='}'&&topChar=='{') || (c==']'&&topChar=='[')){
                return false;
            }

        }
        return true;
    }*/
  public boolean isValid(String s) {
      Stack<Character> stack = new Stack<>();//实例化一个栈空间 先进后出的形式
      for (char c : s.toCharArray()) {
          //用迭代器便利，用 . toCharArray() 将 s 转换为数组
          if (c == '(' || c == '{' || c == '[') {
              // 判断，如果是左括号，则压入栈中
              stack.push(c);
              //进栈  结束本次循环（具体是指怎么实现的我也没看懂，有知道大佬，望评论区留言）
          } else if (c == ')' || c == '}' || c == ']') {
              // 判断 如果是右括号，则需要检查栈是否为空以及栈顶的左括号是否与当前的右括号匹配
              if (stack.isEmpty()) {
                  // 栈为空，说明不可能有对应的左括号，
                  //字符串无效
                  return false;
              }
              char topChar = stack.pop(); //出栈
              // 弹出栈顶的左括号并返回一个 char 的值
              //这里用 toChar 接收
              if ((c == ')' && topChar != '(') || (c == '}' && topChar != '{') || (c == ']' && topChar != '[')) {
                  //  判断 则个出栈的 字符 是否匹配，和这个如果不匹配，字符串无效
                  return false;
              }
          }
      }
      // 遍历完所有字符后，检查栈是否为空
      return stack.isEmpty();
  }
    public static void main(String[] args) {
        LeetCode_20 leetcode = new LeetCode_20();
        boolean valid = leetcode.isValid("()");
        if (valid){
            System.out.println("1");
        }else {
            System.out.println("2");
        }
    }



    /*
错误
    public boolean isValid(String s) {
        int j = s.length()-1;
        int flag =0;
        for (int i =0;i<s.length();i++){
            if(i == j){
                break;
            }
            char c = s.charAt(i);
            char c1 = s.charAt(j);
            if(s.charAt(i) == s.charAt(j) ){
                flag=1;
            }else {
                flag =0;
                break;
            }
        }
        if(flag==1){
            return true;
        }else {
            return false;
        }
    }
*/
















}
